package com.entity.yaml

import com.annotations.DefaultValue
import com.entity.PackPath
import com.serialization.PackPathSerialization
import com.utils.YamlUtil
import io.github.stream29.jsonschemagenerator.Description
import kotlinx.serialization.Contextual
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
@SerialName("config")
data class AppConfig(
    /**
     * 压缩配置
     */
    @property:Description("压缩配置")
    var compress: Compress = Compress(),
    /**
     * 全局配置
     */
    @property:Description("全局配置")
    @field:JvmField
    var global: Global = Global(),
    /**
     * 文件名字crc模式配置
     */
    @property:Description("文件名字crc模式配置")
    @field:JvmField
    var fileCrc: FileCrc = FileCrc(),
    /**
     * 当前项目的忽略文件列表
     *
     * @see java.nio.file.FileSystem.getPathMatcher
     */
    @property:Description("当前项目的忽略文件列表 @see java.nio.file.FileSystem.getPathMatcher")
    val ignoreList: MutableSet<String> = mutableSetOf(),
    /**
     * 运行环境
     */
    @property:Description("运行环境")
    val runEnv: List<RunEnvironment> = emptyList(),
    /**
     * 项目原始目录
     */
    @property:Description("项目原始目录")
    val projectDir: List<String> = emptyList(),
    /**
     * 项目原始目录
     */
    @property:Description("项目原始目录列表")
    val projects: MutableList<Project> = mutableListOf(),
    /**
     * 输出目录
     */
    @property:Description("输出目录")
    @DefaultValue("cache")
    var outDir: @Serializable(PackPathSerialization::class) PackPath = PackPath("cache"),

    @property:Description("文件名替换映射表")
    val replaceNameFile: MutableMap<String, String> = mutableMapOf(),
    /**
     * 要进行数据替换的文件
     */
    @property:Description("要进行数据替换的文件列表")
    val replaceFile: MutableList<String> = mutableListOf(),
    /**
     * 渠道功能 使用此功能后被处理的文件或单独生成
     */
    @property:Description("渠道功能 使用此功能后被处理的文件或单独生成")
    val productFlavors: MutableList<String> = mutableListOf(),
    /**
     * 配置文件内容替换表  第一个是被替换值  第二个是替换后的值
     */
    @property:Description("配置文件内容替换表  第一个是被替换值  第二个是替换后的值")
    val replace: MutableMap<String, MutableMap<String, MutableMap<String, @Contextual String>>> = mutableMapOf(),

    @property:Description("用户自定义配置")
    val user: MutableMap<String, MutableMap<String, @Contextual Any>> = mutableMapOf()
) {
    fun runEnvironment() = runEnv[YamlUtil.unpackEnvId - 1]
}